#include "thttpd.h"
#include <sys/types.h>
#include <sys/wait.h>
#include <pthread.h>
#include "shmem.h"
int shmid;
void *node_p;
int *total;
struct std_node *node_arr;
static void *msg_request(void *arg)
{
	// 这里客户端描述符通过参数传进来了
	int sock_fd = (int)arg;
	// 一般情况下，线程终止后，其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。
	// 但是线程也可以被置为detach状态，这样的线程一旦终止就立刻回收它占用的所有资源，而不保留终止状态。
	pthread_detach(pthread_self());
	// handler_msg作为所有的请求处理入口
	return (void *)handler_msg(sock_fd);
}
// tcp服务器
int main(int argc, char *argv[])
{
	// 如果不传递端口，那么使用默认端口80
	int port = 80;
	if (argc > 1)
	{
		port = atoi(argv[1]);
	}
	shmid = shm_init(1024);
	if (shmid < 0)
	{
		perror("shmget err for temp/hum");
		return -1;
	}
	node_p = shm_getaddr();
	if (node_p == NULL)
	{
		perror("shm_getaddr err for temp/hum");
		return -1;
	}
	printf("node_p:%d\n",node_p);
	// 前4个字节存储实际的学生数目
	total = (int *)node_p;
	*total = 3;
	// 后面空间存储数据点
	node_arr = (struct std_node *)(node_p + sizeof(int));
	printf("total:%d\n", *total);

	node_arr[0].key=203;
	node_arr[0].new_val.f_val = 0;

	node_arr[1].key =204;
	node_arr[1].new_val.f_val = 0;

	node_arr[2].key =205;
	node_arr[2].new_val.f_val = 0;
	// 初始化服务器
	int lis_sock = init_server(port);
	while (1)
	{
		struct sockaddr_in peer;
		socklen_t len = sizeof(peer);
		int sock = accept(lis_sock, (struct sockaddr *)&peer, &len);
		if (sock < 0)
		{
			perror("accept failed");
			continue;
		}
		// 每次接收一个链接后，会自动创建一个线程，这实际上就是线程服务器模型的应用
		pthread_t tid;
		if (pthread_create(&tid, NULL, msg_request, (void *)sock) > 0)
		{
			perror("pthread_create failed");
			close(sock);
		}
	}
	return 0;
}
